题目:http://poj.org/problem?id=2109
Description
This problem involves the efficient computation of integer roots of numbers.
Given an integer n>=1 and an integer p>= 1 you have to write a program that determines the n th positive root of p. In this problem, given such integers n and p, p will always be of the form k to the n th. power, for an integer k (this integer is what your program must find).
Input
Output
Sample Input
2 16 3 27 7 4357186184021382204544
Sample Output
4 3 1234
基本思路:
根据p的位数基本确定k的位数,例如上述例子的最后一个数字4357186184021382204544共22位,除以7取正为3,所以k的位数应该为3。之后我首先考虑的是两分法,但是结果是超时;于是我采用的是逐步确定每一位的数字并且避免做除法运算。
代码:
#include <iostream>
#include <math.h>
using namespace std;
int GetWeight(double num)
{
int result = 0;
while((num/=10) > 1)
{
result++;
};
return result + 1;
}
double GetPow(double value, int weight)
{
double result = 1;
double cur = value;
do
{
if(weight % 2 == 1)
{
result *= cur;
}
cur*=cur;
}
while((weight=weight/=2)!=0);
return result;
}
int main()
{
int n;
double p;
while(cin>>n>>p)
{
if(p == 1)
{
cout<<1;
}
else
{
int w = GetWeight(p);
int weight = w/n;
int left = w - weight * n;
double value = 0;
for(int j = weight; j >= 0; j--)
{
double tmp = GetPow(10,j);
int i =1;
for(; i <= 9; i++)
{
if(GetPow(value + i * tmp, n)>p)
{
break;
}
else if(GetPow(value + i * tmp, n)==p)
{
i++;
break;
}
}
value += (i-1) * tmp;
}
cout<<floor(value)<<endl;
}
};
return 0;
}